/**
 ******************************************************************************
 * @file    
 * @author 
 * @Version 
 * @Date    
 * @brief 
 *******************************************************************************  
 **/
#include "zb32l03x_hal.h"
#include "bsp_key.h"

static void bsp_key_delay()
{
  uint8_t i=50;
  while (i--)
  {
  }
  
}
/*
*********************************************************************************************************
*	功能说明: 初始化
*	形    参: 
*	返 回 值: 
* 说    明：
*********************************************************************************************************
*/

void bsp_key_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    BSP_KEY_POWER_CLKENABLE();
    BSP_KEY_ROW1_CLKENABLE();
    BSP_KEY_ROW2_CLKENABLE();
    BSP_KEY_ROW3_CLKENABLE();
    BSP_KEY_ROW4_CLKENABLE();
    BSP_KEY_COL1_CLKENABLE();
    BSP_KEY_COL2_CLKENABLE();
    BSP_KEY_COL3_CLKENABLE();
    BSP_KEY_COL4_CLKENABLE();
    BSP_KEY_COL5_CLKENABLE();


    GPIO_InitStruct.Pin = BSP_KEY_POWER_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Debounce.Enable = GPIO_DEBOUNCE_DISABLE;
    GPIO_InitStruct.SlewRate = GPIO_SLEW_RATE_HIGH;
    GPIO_InitStruct.DrvStrength = GPIO_DRV_STRENGTH_HIGH;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(BSP_KEY_POWER_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = BSP_KEY_ROW1_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.OpenDrain = GPIO_OPENDRAIN;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(BSP_KEY_ROW1_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = BSP_KEY_ROW2_PIN;
    HAL_GPIO_Init(BSP_KEY_ROW2_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = BSP_KEY_ROW3_PIN;
    HAL_GPIO_Init(BSP_KEY_ROW2_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = BSP_KEY_ROW4_PIN;
    HAL_GPIO_Init(BSP_KEY_ROW2_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = BSP_KEY_COL1_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT;
    GPIO_InitStruct.OpenDrain = GPIO_PUSHPULL;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init(BSP_KEY_COL1_PORT, &GPIO_InitStruct);


    GPIO_InitStruct.Pin = BSP_KEY_COL2_PIN;
    HAL_GPIO_Init(BSP_KEY_COL2_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = BSP_KEY_COL3_PIN;
    HAL_GPIO_Init(BSP_KEY_COL3_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = BSP_KEY_COL4_PIN;
    HAL_GPIO_Init(BSP_KEY_COL4_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = BSP_KEY_COL5_PIN;
    HAL_GPIO_Init(BSP_KEY_COL5_PORT, &GPIO_InitStruct);

    BSP_KEY_ROW1_OUT(1);
    BSP_KEY_ROW2_OUT(1);
    BSP_KEY_ROW3_OUT(1);
    BSP_KEY_ROW4_OUT(1);

    BSP_KEY_COL1_OUT(1);
    BSP_KEY_COL2_OUT(1);
    BSP_KEY_COL3_OUT(1);
    BSP_KEY_COL4_OUT(1);
    BSP_KEY_COL5_OUT(1);
}


/**
  * @brief  获取按键状态
  * @param  
  * @param  
  * @retval NUll
  */
uint32_t bsp_key_read(void)
{
    uint32_t keyvalue=0xffe00000;
    uint8_t temp; 

    keyvalue|=(BSP_KEY_POWER()<<20);

    BSP_KEY_COL1_OUT(0);
    BSP_KEY_COL2_OUT(1);
    BSP_KEY_COL3_OUT(1);
    BSP_KEY_COL4_OUT(1);
    BSP_KEY_COL5_OUT(1);
    bsp_key_delay();

    temp=(BSP_KEY_ROW1()<<3)|(BSP_KEY_ROW2()<<2)|(BSP_KEY_ROW3()<<1)|(BSP_KEY_ROW4()<<0);
    keyvalue|=(temp<<16);

    BSP_KEY_COL1_OUT(1);
    BSP_KEY_COL2_OUT(0);
    BSP_KEY_COL3_OUT(1);
    BSP_KEY_COL4_OUT(1);
    BSP_KEY_COL5_OUT(1);
    bsp_key_delay();

    temp=(BSP_KEY_ROW1()<<3)|(BSP_KEY_ROW2()<<2)|(BSP_KEY_ROW3()<<1)|(BSP_KEY_ROW4()<<0);
    keyvalue|=(temp<<12);

    BSP_KEY_COL1_OUT(1);
    BSP_KEY_COL2_OUT(1);
    BSP_KEY_COL3_OUT(0);
    BSP_KEY_COL4_OUT(1);
    BSP_KEY_COL5_OUT(1);
    bsp_key_delay();

    temp=(BSP_KEY_ROW1()<<3)|(BSP_KEY_ROW2()<<2)|(BSP_KEY_ROW3()<<1)|(BSP_KEY_ROW4()<<0);
    keyvalue|=(temp<<8);

    BSP_KEY_COL1_OUT(1);
    BSP_KEY_COL2_OUT(1);
    BSP_KEY_COL3_OUT(1);
    BSP_KEY_COL4_OUT(0);
    BSP_KEY_COL5_OUT(1);
    bsp_key_delay();

    temp=(BSP_KEY_ROW1()<<3)|(BSP_KEY_ROW2()<<2)|(BSP_KEY_ROW3()<<1)|(BSP_KEY_ROW4()<<0);
    keyvalue|=(temp<<4);


    BSP_KEY_COL1_OUT(1);
    BSP_KEY_COL2_OUT(1);
    BSP_KEY_COL3_OUT(1);
    BSP_KEY_COL4_OUT(1);
    BSP_KEY_COL5_OUT(0);
    bsp_key_delay();

    temp=(BSP_KEY_ROW1()<<3)|(BSP_KEY_ROW2()<<2)|(BSP_KEY_ROW3()<<1)|(BSP_KEY_ROW4()<<0);
    keyvalue|=(temp<<0);

    return ~keyvalue;
}
